#!/usr/bin/python
# -*-coding:UTF-8 -*-

# ========================
# @Time  : 2021/2/8
# @Author: Sunny
# ========================
"""
自定义属性访问和设置规则

"""

class MyTest:
    #如果类里面没有写这个方法，当外部访问属性时，会自动调用Mytest类父类object里面的 __getattribute__方法
    def __getattribute__(self, item): #item是用来接收属性名的
        """访问属性的时候，会调用这个方法，这个方法的返回值，就是查找的属性值"""
        #作用：在某些场景下，限制属性的访问
        print('-----访问属性的方法------------')
        print(f'item:{item}')
        return super().__getattribute__(item)


    #
    # #触发机制：外部访问属性的时候，会先触发__getattribute__方法，如果没有找到属性，再触发 __getattr__方法
    # #自动捕获异常，返回用户自定义的内容
    # def __getattr__(self, item): #item是用来接收属性名的
    #     """有时候如果属性查找不存在的情况下会，程序会报错：属性不存在，
    #         但是只要定义了该方法，会自动调用该方法，捕获异常，返回用户自定义的内容"""
    #     print('---getattr--访问属性的方法------------')
    #     print(f'item:{item}')
    #     return None


    # def __init__(self,nam):
    #     self.nam = nam

    # #此方法在属性设置的时候触发，无论是外部动态设置属性，还是内部__init__设置属性，所以重写
    # #了该方法后，一定要返回object对象原来设置属性的方法，才能实现设置功能
    # def __setattr__(self, key, value):
    #     """属性设置的时候会触发该方法"""
    #     print('---__setattr__--访问属性的方法------------')
    #     print(f'key:{key}')
    #     print(f'value:{value}')
    #     return super().__setattr__(key, value)



    # def __delattr__(self, item):
    #     """删除属性的时候触发"""
    #     print('---__delattr__方法-------')
    #     #一定要调用父类的__delattr__方法，否则删除功能实现不了
    #     super().__delattr__(item)

print('__getattribute__案例讲解的调试----------')
m = MyTest()
m.name = 'musen'
print(m.name)
#
#
# print('__getattr__案例讲解的调试----------')
# m = MyTest()
# print(m.age)  #age属性不存在，如果没有__getattr，程序会报错
# print(m.age)  #定义过__getattr__方法，会返回None


# print('__getattr__案例讲解的调试----------')
# m1 = MyTest('musen')
# m1.sex = '男'
# print(m1.sex)

# print('__delattr__案例讲解的调试----------')
# m2 = MyTest('musen')
# print(m2.nam)
# del m2.nam
# print(m2.nam)  #会报错，因为nam属性已经被删除了

